Ansible 条件选择
playbook也可以像shell脚本的if语句那样,基于一个变量的结果来判断是否应该执行某个task.只是ansible的逻辑判断和语法上要别扭,复杂点.
when语句
when语句的条件判断使用非常简单,一般包含2种用法:
1.基于变量值来判断是否应该执行某个task:
1 |
|
执行结果:
1 | [root@localhost playbook]$ansible-playbook when.yaml |
可以看到只在230这个IP上执行了动作.
另外,还可以基于or 或者 and的条件判断.例如:
1 | tasks: |
或者and,同时满足2个条件
1 | tasks: |
note: 也可以写成 when: ansible_distribution == “CentOS” and ansible_distribution_major_version == “6”
2.基于某个task执行的成功与否作为条件.例如.执行 ls /home/work这个动作,来判断如果有这个文件,则创建个软链.此时就要忽略ls /home/work 这个动作可能出现错误(文件不存在).
1 | --- |
register注册一个result的变量,该变量是ls /home/work这个task的执行结果..然后when条件判断当result执行成功,或者执行失败时,才执行相应的task任务
when结合loop循环
变量注册的结果可以是字符串,布尔值,也可以是列表.使用”loop”或者”with_items”关键字可以对变量进行循环.例如:
1 | - name: registered variable usage as a loop list |
执行结果:
1 | [root@localhost ~]# ls /home |
when调用变量
有时候when也需要对2个变量来进行比较,判断是否满足条件.例如:
1 | - hosts: dev beta |
上面的when语句表示,只有在变量server_group主机组的主机才满足条件.这里不能像其他地方一样用双大括号的方式来调用变量.否则会出现如下错误:
1 | [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: inventory_hostname in groups[ '{{ server_group }}' ] |